package service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import org.jaaksi.commondemo.model.Person;

public class MyService extends Service {

  public static final String TAG = "MyService";

  private MsgManagerImpl mBinder;

  /**
   * Service第一次创建的时候回调
   */
  @Override public void onCreate() {
    super.onCreate();
    mBinder = new MsgManagerImpl();
    Log.i(TAG, "onCreate() executed");
  }

  @Override public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
  }

  /**
   * 通过startService启动的时候回调，多次调用会多次回调，但onCreate只会回调一次
   * onStartCommand使用时，返回的是一个(int)整形。
   * 这个整形可以有四个返回值：start_sticky、start_no_sticky、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。
   * 它们的含义分别是：
   * 1):START_STICKY：如果service进程被kill掉，保留service的状态为开始状态，但不保留递送的intent对象。
   * 随后系统会尝试重新创建service，由于服务状态为开始状态，所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。
   * 如果在此期间没有任何启动命令被传递到service，那么参数Intent将为null。
   * 2):START_NOT_STICKY：“非粘性的”。使用这个返回值时，如果在执行完onStartCommand后，服务被异常kill掉，系统不会自动重启该服务
   * 3):START_REDELIVER_INTENT：重传Intent。使用这个返回值时，如果在执行完onStartCommand后，服务被异常kill掉，系统会自动重启该服务，并将Intent的值传入。
   *
   * 4):START_STICKY_COMPATIBILITY：START_STICKY的兼容版本，但不保证服务被kill后一定能重启。
   *
   * onStartComand参数flags含义
   *
   * flags表示启动服务的方式：
   * Additional data about this start request. Currently either 0, START_FLAG_REDELIVERY, or
   * START_FLAG_RETRY.
   *
   * START_FLAG_REDELIVERY：如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作,
   * 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent。这样如果你的服务在处理它的时候被Kill掉,
   * Intent不会丢失.
   * START_FLAG_RETRY：表示服务之前被设为START_STICKY，则会被传入这个标记。
   */
  @Override public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand() executed");
    if (intent != null) {
      Person person = (Person) intent.getSerializableExtra("info");
      int id = intent.getIntExtra("id", -1);
    }
    // service被kill掉之后，会重启服务，并传入Intent
    return Service.START_REDELIVER_INTENT;
  }

  @Override public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "onDestroy() executed");
  }

  /**
   * 通过bindService启动的时候会回调这个,可以在bind的回到onServiceConnected中拿到这个IBinder引用，从而调用方法
   */
  @Override public IBinder onBind(Intent intent) {
    Log.i(TAG, "onBind() executed");
    return mBinder;
  }
}